#ifndef __TM1638_H__
#define __TM1638_H__

#include "cm32m101a.h"
#include "gpio.h"

/*   NSS-PA4   */
#define NSS_PORT        GPIOA
#define NSS_PIN         GPIO_PIN_4
/*   SCK-PA4   */
#define SCK_PORT        GPIOA
#define SCK_PIN         GPIO_PIN_5
/*   MISO-PA4   */
#define MISO_PORT        GPIOA
#define MISO_PIN         GPIO_PIN_6
/*   MOSI-PA4   */
#define MOSI_PORT        GPIOA
#define MOSI_PIN         GPIO_PIN_7



extern uint8_t DispTab[4];
extern uint8_t Update_disp_flg;

#define TM1638_STB(X)              if(X) GPIO_SetBits(NSS_PORT, NSS_PIN);\
                                   else GPIO_ResetBits(NSS_PORT, NSS_PIN)

#define TM1638_CLK(X)              if(X) GPIO_SetBits(SCK_PORT, SCK_PIN);\
                                   else GPIO_ResetBits(SCK_PORT, SCK_PIN)
                                       
#define TM1638_DIO_OUT()            GPIO_OutInit(MISO_PORT, MISO_PIN)
                                         
#define TM1638_DIO_IN()             GPIO_InputInit(MISO_PORT,MISO_PIN)
                                   
#define TM1638_DIO_DataOUT(X)        if(X) GPIO_SetBits(MISO_PORT, MISO_PIN);\
                                     else  GPIO_ResetBits(MISO_PORT, MISO_PIN)
                                   
#define TM1638_DIO_DataIN()          GPIO_ReadInputDataBit(MISO_PORT,MISO_PIN)

                                     
//地址命令设置
#define TM1638_GRID1               0xc0
#define TM1638_GRID2               0xc1
#define TM1638_GRID3               0xc2
#define TM1638_GRID4               0xc3
#define TM1638_GRID5               0xc4
#define TM1638_GRID6               0xc5
#define TM1638_GRID7               0xc6
#define TM1638_GRID8               0xc7
                                   
#define TM1638_GRID9               0xc8
#define TM1638_GRID10              0xc9
#define TM1638_GRID11              0xca
#define TM1638_GRID12              0xcb
#define TM1638_GRID13              0xcc
#define TM1638_GRID14              0xcd
#define TM1638_GRID15              0xce
#define TM1638_GRID16              0xcf


//数据命令设置
/*
#define 0x40   //写数据到显示寄存器
#define 0x42   //读键扫数据
#define 0x40   //自动地址增加
#define 0x44   //固定地址
#define 0x40   //普通模式
#define 0x48   //测试模式
*/

//显示
/*
#define 0x80   //显示关
#define 0x88   //显示开
*/

void TM1638_keytime_handle(void);  
void Read_key(uint8_t *KeyValue);

void dispclear(uint8_t n,uint8_t m);
void Flicker(uint8_t n);
void display_led(uint8_t dig,uint8_t dat);
void display(uint8_t dig,uint8_t dat);
void DigitalTube_led(uint8_t dig,uint8_t Data,uint8_t onoff);
void UpdateDisp(void);
void Write_DATA(uint8_t add,uint8_t DATA);
void TM1638_Digital_LED_SET(uint16_t led_state);
uint32_t TM1638_Read_Key(void);

void TM1638_Init(void);


#endif

